package com.dys.util;

import com.dys.rowmapper.RowMapper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @className: com.dys.util.DaoUtils
 * @description: 封装通用的写(增 、 删 、 改)操作
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/13 下午11:23
 */
public class DaoDruidUtil<T> {

    /**
     * 通用写操作
     *
     * @param sql    写的sql语句
     * @param params 传递的占位符参数
     * @return 受影响行数 1: 写入成功, 0:写入失败
     */
    public int commonUpdate(String sql, Object... params) {
        Connection conn = null;
        PreparedStatement ps = null;
        int count = 0;
        try {
            // 1、获取连接
            conn = DBDruidUtil.getConnection();

            // 2、获取PreparedStatement，传入SQL
            ps = conn.prepareStatement(sql);

            // 3、给占位符赋值
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i + 1, params[i]);
            }

            // 4、执行SQL，获取结果
            count = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 5、释放资源
            DBDruidUtil.closeAll(null, ps);
        }
        // 6、返回响应结果
        return count;
    }

    /**
     * 封装公共读操作
     *
     * @param sql    查询的sql语句
     * @param row    ResultSet封装的结果集
     * @param params 传递的占位符参数
     * @return 查询的结果集
     * @throws SQLException
     */
    public List<T> commonSelect(String sql, RowMapper<T> row, Object... params) throws SQLException {
        // 1、获取连接
        Connection conn = DBDruidUtil.getConnection();
        // 2、获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 3、给占位符赋值
        for (int i = 0; i < params.length; i++) {
            ps.setObject(i + 1, params[i]);
        }
        // 4、执行SQL，拿到ResultSet结果集
        ResultSet rs = ps.executeQuery();
        // 5、封装结果集
        List<T> list = new ArrayList<T>();
        while (rs.next()) {
            T t = row.rowMapper(rs);
            list.add(t);
        }
        // 6、释放资源
        DBDruidUtil.closeAll(null, ps, rs);
        // 7、返回响应结果
        return list;
    }

}
